from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client
"""
自定义文件存储系统:
1, 自定义类,继承自django.core.files.storage.Storage：
2, 编写init方法,保证实例化参数,创建对象
3, 实现_open()和_save(),还有其他方法exists(),url()

"""
class FastDFSStorage(Storage):

    #1,重写init,保证对象的参数能够初始化
    def __init__(self,base_url=None,config_path=None):

        if not base_url:
            base_url = settings.FDFS_URL

        if not config_path:
            config_path = settings.FDFS_CLIENT_CONF

        self.base_url = base_url
        self.config_path = config_path

    #2,当打开文件的时候,调用该方法,暂时不用打开(不用编写逻辑)
    def open(self, name, mode='rb'):
        pass

    #3,当向存储系统storage中保存一个文件的时候调用
    def save(self, name, content, max_length=None):
        """
        :param name: 文件名
        :param content: context文件内容
        :param max_length: 最大的上传大小
        :return:
        """
        #1,创建client对象
        client = Fdfs_client('utils/fastdfs/client.conf')

        #2,上传图片
        result = client.upload_by_buffer(content.read())

        #3,判断图片是否上传成功
        if result.get("Status") == "Upload successed.":

            return result.get("Remote file_id")

        else:
            raise Exception("图片上传失败")

    #4,存储文件的时候,判断文件是否重名
    def exists(self, name):
        return False

    #5,文件上传成功之后,返回的url地址, name指的就是在storage中的文件路径
    def url(self, name):
        return self.base_url + name


